package com.rem.jul;

import org.junit.Test;

import java.io.InputStream;
import java.util.logging.*;

/**
 * JUL全称Java util Logging是java原生的日志框架，使用时不需要另外引用第三方类库，相对其他日志框
 * 架使用方便，学习简单，能够在小型应用中灵活使用。
 *
 * @author Rem
 * @date 2023-01-15
 */
public class JULTest {

    /**
     * 快速入门
     */
    @Test
    public void testQuick() {
        Logger logger = Logger.getLogger(this.getClass().getName());
        logger.info("a");
        logger.log(Level.WARNING, "b");

        logger.log(Level.INFO, "用户信息：{0},{1}", new Object[]{"张三", 18});
    }

    /**
     * 日志的所有级别
     *
     * @throws Exception
     */
    @Test
    public void testLogLevel() {
        // 1.获取日志对象
        Logger logger = Logger.getLogger(this.getClass().getName());
        // 2.日志记录输出 最严重到最轻，默认info级别
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("cofnig");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    /**
     * 自定日志级别
     *
     * @throws Exception
     */
    @Test
    public void testLogConfig() throws Exception {
        // 1.创建日志记录器对象
        Logger logger = Logger.getLogger(this.getClass().getName());
        // 一、自定义日志级别
        // a.关闭系统默认配置
        logger.setUseParentHandlers(false);
        // b.创建handler对象
        ConsoleHandler consoleHandler = new ConsoleHandler();
        // c.创建formatter对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();
        // d.进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);
        // e.设置日志级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);
        // 二、输出到日志文件
        FileHandler fileHandler = new FileHandler("/Users/rem/logs/jul.log");
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);

        // 2.日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    /**
     * Logger之间的父子关系
     *
     * @throws Exception
     */
    @Test
    public void testLogParent() {
        // 日志记录器对象父子关系
        Logger  logger = Logger.getLogger("com.rem.jul");
        Logger logger2 = Logger.getLogger("com.rem");
        System.out.println( logger.getParent() == logger2);
        // 所有日志记录器对象的顶级父元素 class为java.util.logging.LogManager$RootLoggername为 ""
        System.out.println("logger2 parent:" + logger2.getParent() + "，name：" + logger2.getParent().getName());
    }

    @Test
    public void testProperties() throws Exception {
        // 读取自定义配置文件
        InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
        // 获取日志管理器对象
        LogManager logManager = LogManager.getLogManager();
        // 通过日志管理器加载配置文件
        logManager.readConfiguration(in);

        Logger logger = Logger.getLogger(this.getClass().getName());
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }
}
